package com.school.service.impl;

import com.school.dao.RoleDao;
import com.school.dao.UserDao;
import com.school.dao.impl.RoleDaoImpl;
import com.school.dao.impl.UserDaoImpl;
import com.school.model.Permission;
import com.school.model.Role;
import com.school.model.User;
import com.school.service.UserService;
import com.school.vo.UserRolesVo;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * 复杂功能的包装，对数据单元操作进行组装实现复杂功能
 */
public class UserServiceImpl implements UserService {
    /**
     * 创建数据库访问对象实力
     */
    private UserDao userDao = new UserDaoImpl();
    private RoleDao roleDao = new RoleDaoImpl();

    @Override
    public User insert(User user) {
        return userDao.insert(user);
    }

    @Override
    public List<User> insert(List<User> students) {
        return userDao.insert(students);
    }

    @Override
    public void delete(Integer id) {
        userDao.delete(id);
    }

    @Override
    public void delete(Collection<Integer> ids) {
        userDao.delete(ids);
    }

    @Override
    public void update(User user) {
        userDao.update(user);
    }

    @Override
    public void update(List<User> students) {
        userDao.update(students);
    }

    @Override
    public int count() {
        return userDao.count();
    }

    @Override
    public User findOneById(Integer id) {
        return userDao.findOneById(id);
    }

    @Override
    public List<User> findPage(User user, Integer page, Integer size) {
        // page : 当前页数 5 ，10    0，1，2，3，4
        int offset = (page - 1) * size;
        return userDao.findPage(user, offset, size);
    }

    @Override
    public Integer signIn(String username, String password) {
        // 如果有验证码在这做判断
        return userDao.signIn(username, password);
    }

    @Override
    public UserRolesVo getRole(Integer userId) {
        // 1、根据id查询用户信息
        User user = userDao.findOneById(userId);
        // 2、包装一个UserRoles对象
        UserRolesVo userRolesVo = new UserRolesVo();
        // 2.1、设置用户id
        userRolesVo.setUserid(userId);
        // 2.2、设置用户名称
        userRolesVo.setUsername(user.getUsername());
        // 2.3、设置角色列表
        // List<Role> role = userDao.getRole(userId);
        // 2.3.1、通过用户id获取角色id集合
        List<Integer> roleIds = userDao.getRoleIdsByUserId(userId);
        // 2.3.2、通过角色id集合获取角色信息
        List<Role> role = userDao.getRolesByIds(roleIds);
        userRolesVo.setRoles(role);
        return userRolesVo;
    }

    @Override
    public UserRolesVo getPermission(Integer userId) {
        // 调用上面的getRole获取角色或用户信息
        UserRolesVo role = getRole(userId);
        // 补充全权限信息
        // 2.1、根据角色的ids查询权限ids
        List<Integer> RoleIds = new LinkedList<>();
        for (Role roleRole : role.getRoles()) {
            RoleIds.add(roleRole.getId());
        }
        Set<Integer> permissionIdsByRoleIds = roleDao.getPermissionIdsByRoleIds(RoleIds);
        // 2.2、根据权限ids查询权限信息
        List<Permission> permissionsByIds = roleDao.getPermissionsByIds(permissionIdsByRoleIds);
        role.setAuths(permissionsByIds);
        return role;
    }
}
